home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE6i.s < prev    next >
Text File  |  1994-07-23  |  11KB  |  353 lines

  1.  
  2. ; Lezione6i.s    TESTO A 3 COLORI CON UN COLORE LAMPEGGIANTE OTTENUTO USANDO
  3. ;        UNA TABELLA DI COLORI RGB PREFISSATI.
  4.  
  5.  
  6.     SECTION    CiriCop,CODE    ; NOTA: ho tolto alcuni commenti iniziali per
  7.                 ; risparmiare spazio!
  8.  
  9. Inizio:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Nome lib
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  17.  
  18.     MOVE.L    #BITPLANE,d0    ; dove puntare
  19.     LEA    BPLPOINTERS,A1    ; puntatori COP
  20.     move.w    d0,6(a1)
  21.     swap    d0
  22.     move.w    d0,2(a1)
  23.  
  24.     MOVE.L    #BITPLANE2,d0    ; dove puntare
  25.     LEA    BPLPOINTERS2,A1    ; puntatori COP
  26.     move.w    d0,6(a1)
  27.     swap    d0
  28.     move.w    d0,2(a1)
  29.  
  30.     move.l    #COPPERLIST,$dff080    ; nostra COP
  31.     move.w    d0,$dff088        ; START COP
  32.     move.w    #0,$dff1fc        ; NO AGA!
  33.     move.w    #$c00,$dff106        ; NO AGA!
  34.  
  35.     LEA    TESTO(PC),A0    ; testo da stampare
  36.     LEA    BITPLANE,A3    ; destinazione
  37.     bsr.w    print        ; Stampa
  38.  
  39.     LEA    TESTO2(PC),A0    ; testo da stampare
  40.     LEA    BITPLANE2,A3    ; destinazione
  41.     bsr.w    print        ; Stampa
  42.  
  43. mouse:
  44.     cmpi.b    #$ff,$dff006    ; Linea 255?
  45.     bne.s    mouse
  46.  
  47.     btst    #2,$dff016    ; tasto destro?
  48.     beq.s    aspetta
  49.  
  50.     bsr.w    Lampeggio    ; Fa lampeggiare il Color2 in copperlist
  51.  
  52. Aspetta:
  53.     cmpi.b    #$ff,$dff006    ; linea 255?
  54.     beq.s    Aspetta
  55.  
  56.     btst    #6,$bfe001    ; mouse premuto?
  57.     bne.s    mouse
  58.  
  59.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  60.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  61.  
  62.     move.l    4.w,a6
  63.     jsr    -$7e(a6)    ; Enable
  64.     move.l    gfxbase(PC),a1
  65.     jsr    -$19e(a6)    ; Closelibrary
  66.     rts
  67.  
  68. ;    Dati
  69.  
  70. GfxName:
  71.     dc.b    "graphics.library",0,0
  72.  
  73. GfxBase:
  74.     dc.l    0
  75.  
  76. OldCop:
  77.     dc.l    0
  78.  
  79. ;    Routine di lampeggiamento che sfrutta una TABELLA di sfumature gia'
  80. ;    pronte. La TABELLA non e' altro che una serie di words contenenti
  81. ;    i vari valori RGB che il COLOR1 dovra' assumere nei vari fotogrammi.
  82. ;    Questa routine copia la word successiva nella tabella ogni volta che
  83. ;    viene eseguita, e una volta raggiunta l'ultima word della TABELLA,
  84. ;    ossia 1 word (2 bytes) prima della label FINECOLORTAB, riparte la
  85. ;    lettura della tabella dall'inizio, ad esempio:
  86. ;
  87. ;    dc.w    1,3,5,7,9,8,6,4,2,1    ; la nostra "mini" tabella
  88. ;
  89. ;    Durante i vari fotogrammi le word saranno copiate, all'infinito, con
  90. ;    questo ordine:
  91. ;
  92. ;    1,3,5,7,9,8,6,4,2,1,1,3,5,7,9,8,6,4,2,1,1,3,5,7,9,8,6,4,2,1....
  93. ;
  94. ;    L'indirizzo dell'ultima word letta viene tenuto nella long COLTABPOINT
  95.  
  96. Lampeggio:
  97.     ADDQ.L    #2,COLTABPOINT    ; Fai puntare alla word successiva
  98.     MOVE.L    COLTABPOINT(PC),A0 ; indirizzo contenuto in long COLTABPOINT
  99.                    ; copiato in a0
  100.     CMP.L    #FINECOLORTAB-2,A0 ; Siamo arrivati all'ultima word della TAB?
  101.     BNE.S    NOBSTART2        ; non ancora? allora continua
  102.     MOVE.L    #COLORTAB-2,COLTABPOINT    ; Riparti a puntare dalla prima word
  103. NOBSTART2:
  104.     MOVE.W    (A0),COLORE1    ; copia la word dalla tabella al colore COP
  105.     rts
  106.  
  107.  
  108. COLTABPOINT:            ; Questa longword "PUNTA" a COLORTAB, ossia
  109.     dc.l    COLORTAB-2    ; contiene l'indirizzo di COLORTAB. Terra'
  110.                 ; l'indirizzo del'ultima word "letta" dentro
  111.                 ; la tabella. (qua inizia da COLORTAB-2 in
  112.                 ; quanto Lampeggio inizia con un ADDQ.L #2,C..
  113.                 ; serve per "bilanciare" la prima istruzione.
  114.  
  115. ;    La tabella con i valori "precalcolati" del lampeggiamento di color0
  116.  
  117. COLORTAB:
  118.     dc.w    $000,$000,$001,$011,$011,$011,$012,$012    ; inizio SCURO
  119.     dc.w    $022,$022,$022,$023,$023
  120.     dc.w    $033,$033,$034
  121.     dc.w    $044,$044
  122.     dc.w    $045,$055,$055
  123.     dc.w    $056,$056,$066,$066,$066
  124.     dc.w    $167,$167,$177,$177,$177,$177,$177
  125.     dc.w    $278,$278,$278,$288,$288,$288,$288,$288
  126.     dc.w    $389,$389,$399,$399,$399,$399
  127.     dc.w    $39a,$39a,$3aa,$3aa,$3aa
  128.     dc.w    $3ab,$3bb,$3bb,$3bb
  129.     dc.w    $4bc,$4cc,$4cc,$4cc
  130.     dc.w    $4cd,$4cd,$4dd,$4dd,$4dd
  131.     dc.w    $5de,$5de,$5ee,$5ee,$5ee,$5ee
  132.     dc.w    $6ef,$6ff,$6ff,$7ff,$7ff,$8ff,$8ff,$9ff    ; ,massimo CHIARO
  133.     dc.w    $5ee,$5ee,$5ee,$5de,$5de,$5de
  134.     dc.w    $4dd,$4dd,$4dd,$4cd,$4cd
  135.     dc.w    $4cc,$4cc,$4cc,$4bc
  136.     dc.w    $3cb,$3bb,$3bb
  137.     dc.w    $3ba,$3aa,$3aa
  138.     dc.w    $3a9,$399,$399
  139.     dc.w    $298,$288
  140.     dc.w    $187,$177
  141.     dc.w    $076,$066
  142.     dc.w    $065,$055
  143.     dc.w    $054,$044
  144.     dc.w    $034
  145.     dc.w    $022
  146.     dc.w    $011
  147.     dc.w    $000            ; di nuovo SCURO
  148. FINECOLORTAB:
  149.  
  150. ;    Routine che stampa caratteri larghi 8x8 pixel
  151.  
  152. PRINT:
  153.     MOVEQ    #23-1,D3    ; NUMERO RIGHE DA STAMPARE: 23
  154. PRINTRIGA:
  155.     MOVEQ    #40-1,D0    ; NUMERO COLONNE PER RIGA: 40
  156. PRINTCHAR2:
  157.     MOVEQ    #0,D2        ; Pulisci d2
  158.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  159.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE
  160.     MULU.W    #8,D2        ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE
  161.     MOVE.L    D2,A2
  162.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  163.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  164.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  165.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  166.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  167.     MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  168.     MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  169.     MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  170.     MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  171.  
  172.     ADDQ.w    #1,A3        ; A1+1, avanziamo di 8 bit (PROSSIMO CARATTERE)
  173.  
  174.     DBRA    D0,PRINTCHAR2    ; STAMPIAMO D0 (40) CARATTERI PER RIGA
  175.  
  176.     ADD.W    #40*7,A3    ; ANDIAMO A CAPO
  177.  
  178.     DBRA    D3,PRINTRIGA    ; FACCIAMO D3 RIGHE
  179.  
  180.     RTS
  181.  
  182.  
  183.         ; numero caratteri per linea: 40
  184. TESTO:         ;          1111111111222222222233333333334
  185.          ;     1234567890123456789012345678901234567890
  186.     dc.b    '   PRIMA RIGA (solo in testo1)          ' ; 1
  187.     dc.b    '                                        ' ; 2
  188.     dc.b    '     /\  /                              ' ; 3
  189.     dc.b    '    /  \/                               ' ; 4
  190.     dc.b    '                                        ' ; 5
  191.     dc.b    '        SESTA RIGA (entrambi i bitplane)' ; 6
  192.     dc.b    '                                        ' ; 7
  193.     dc.b    '                                        ' ; 8
  194.     dc.b    'FABIO CIUCCI               INTERNATIONAL' ; 9
  195.     dc.b    '                                        ' ; 10
  196.     dc.b    '   1  4 6 89  !@ $ ^& () +| =- ]{       ' ; 11
  197.     dc.b    '                                        ' ; 12
  198.     dc.b    '     LA  A I G N T C  OBLITERAZIONE     ' ; 15
  199.     dc.b    '                                        ' ; 25
  200.     dc.b    '                                        ' ; 16
  201.     dc.b    '  Nel mezzo del cammin di nostra vita   ' ; 17
  202.     dc.b    '                                        ' ; 18
  203.     dc.b    '    Mi RitRoVaI pEr UnA sELva oScuRa    ' ; 19
  204.     dc.b    '                                        ' ; 20
  205.     dc.b    '    CHE LA DIRITTA VIA ERA              ' ; 21
  206.     dc.b    '                                        ' ; 22
  207.     dc.b    '  AHI Quanto a DIR QUAL ERA...          ' ; 23
  208.     dc.b    '                                        ' ; 24
  209.     dc.b    '                                        ' ; 25
  210.     dc.b    '                                        ' ; 26
  211.     dc.b    '                                        ' ; 27
  212.  
  213.     EVEN
  214.  
  215.         ; numero caratteri per linea: 40
  216. TESTO2:         ;          1111111111222222222233333333334
  217.          ;     1234567890123456789012345678901234567890
  218.     dc.b    '                                        ' ; 1
  219.     dc.b    '  SECONDA RIGA (solo in testo2)         ' ; 2
  220.     dc.b    '     /\  /                              ' ; 3
  221.     dc.b    '    /  \/                               ' ; 4
  222.     dc.b    '                                        ' ; 5
  223.     dc.b    '        SESTA RIGA (entrambi i bitplane)' ; 6
  224.     dc.b    '                                        ' ; 7
  225.     dc.b    '                                        ' ; 8
  226.     dc.b    'FABIO        COMMUNICATION INTERNATIONAL' ; 9
  227.     dc.b    '                                        ' ; 10
  228.     dc.b    '   1234567 90  @#$%^&*( _+|\=-[]{}      ' ; 11
  229.     dc.b    '                                        ' ; 12
  230.     dc.b    '     LA PALINGENETICA  B I E A I N      ' ; 15
  231.     dc.b    '                                        ' ; 25
  232.     dc.b    '                                        ' ; 16
  233.     dc.b    '  Nel       del cammin di        vita   ' ; 17
  234.     dc.b    '                                        ' ; 18
  235.     dc.b    '    Mi          pEr UnA       oScuRa    ' ; 19
  236.     dc.b    '                                        ' ; 20
  237.     dc.b    '    CHE LA         VIA ERA SMARRITA     ' ; 21
  238.     dc.b    '                                        ' ; 22
  239.     dc.b    '  AHI Quanto a     QUAL ERA...          ' ; 23
  240.     dc.b    '                                        ' ; 24
  241.     dc.b    '                                        ' ; 25
  242.     dc.b    '                                        ' ; 26
  243.     dc.b    '                                        ' ; 27
  244.  
  245.     EVEN
  246.  
  247.  
  248.     SECTION    GRAPHIC,DATA_C
  249.  
  250. COPPERLIST:
  251.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  252.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  253.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  254.     dc.w    $13e,0
  255.  
  256.     dc.w    $8E,$2c81    ; DiwStrt
  257.     dc.w    $90,$2cc1    ; DiwStop
  258.     dc.w    $92,$38        ; DdfStart
  259.     dc.w    $94,$d0        ; DdfStop
  260.     dc.w    $102,0        ; BplCon1
  261.     dc.w    $104,0        ; BplCon2
  262.     dc.w    $108,0        ; Bpl1Mod
  263.     dc.w    $10a,0        ; Bpl2Mod
  264.             ; 5432109876543210
  265.     dc.w    $100,%0010001000000000    ; 2 bitplane LOWRES 320x256
  266.  
  267. BPLPOINTERS:
  268.     dc.w $e0,0,$e2,0    ;primo     bitplane
  269. BPLPOINTERS2:
  270.     dc.w $e4,0,$e6,0    ;secondo bitplane
  271.  
  272.     dc.w    $180,$000    ; color0 - SFONDO
  273.     dc.w    $182
  274. COLORE1:
  275.     dc.w    $000        ; color1 - SCRITTE primo bitplane (blu)
  276.     dc.w    $184,$f62    ; color2 - SCRITTE secondo bitplane (arancio)
  277.     dc.w    $186,$1e4    ; color3 - SCRITTE primo+secondo bitpl. (verde)
  278.  
  279.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  280.  
  281. ;    Il FONT caratteri 8x8
  282.  
  283. FONT:
  284.     incbin    "metal.fnt"
  285. ;    incbin    "normal.fnt"
  286. ;    incbin    "nice.fnt"
  287.  
  288.     SECTION    MIOPLANE,BSS_C
  289.  
  290. BITPLANE:
  291.     ds.b    40*256    ; lowres 320x256
  292. BITPLANE2:
  293.     ds.b    40*256    ; lowres 320x256
  294.  
  295.     end
  296.  
  297. Con l'uso di valori predeterminati, o "precalcolati" si possono ottenere
  298. effetti di movimento o di sfumatura dei colori molto migliori che tramite
  299. l'uso di soli ADD e SUB.
  300. L'unica "novita'" e' la tecnica di programmazione della routine "Lampeggio" che
  301. legge i valori da mettere nel "COLORE1" da una tabella, in cui viene usato
  302. un PUNTATORE all'ultima word letta, ossia una LONGWORD che contiene l'indirizzo
  303. di quella word nella tabella. Da notare che un:
  304.  
  305. COLTABPOINT:
  306.     dc.l    COLORTAB
  307.  
  308. E' come un
  309.  
  310. COLTABPOINT:
  311.     DC.L    0
  312.  
  313. Dopo un MOVE.L #COLORTAB,COLTABPOINT, ossia viene assemblata una longword che
  314. contiene l'indirizzo della label in questione. In questa routine c'e' un
  315.  
  316.     dc.l    COLORTAB-2
  317.  
  318. Ma e' soltanto per far leggere la prima word la prima volta, dato che la
  319. routine comincia con:
  320.  
  321. Lampeggio:
  322.     ADDQ.L    #2,COLTABPOINT    ; Fai puntare alla word successiva
  323.  
  324. Bisogna che COLTABPOINT contenga l'inizio della prima word-2, almeno dopo il
  325. primo ADDQ.L #2 al primo jsr viene copiata la prima word e non la seconda.
  326. Successivamente la longword COLTABPOINT sara' aumentata di 2 ogni volta, ossia
  327. l'indirizzo che contiene sara' quello delle varie word, fino a che non
  328. raggiungera' l'ultima word, che comincia 2 bytes prima della fine della
  329. tabella:
  330.  
  331.  
  332. ; siamo a questo indirizzo quando leggiamo l'ultima word...
  333.     dc.w    $0000            ; di nuovo SCURO
  334. FINECOLORTAB:
  335.  
  336. A questo punto con un:
  337.  
  338.     MOVE.L    #COLORTAB,COLTABPOINT    ; Riparti a puntare dalla prima word
  339.  
  340. la label COLTABPOINT ritorna a contenere l'indirizzo della prima word.
  341.  
  342. Potete usare questa routine cambiando la tabella per moltissimi scopi, per
  343. esempio per far saltellare o ondeggiare uno sprite.
  344.  
  345. Provate a sostituire la tabella con questa:
  346.  
  347. COLORTAB:
  348.     dc.w    $26F,$27E,$28D,$29C,$2AB,$2BA,$2C9,$2D8,$2E7,$2F6
  349.     dc.w    $4E7,$6D8,$8C9,$ABA,$CAA,$D9A,$E8A,$F7A,$F6B,$F5C
  350.     dc.w    $D6D,$B6E,$96F,$76F,$56F,$36F
  351. FINECOLORTAB:
  352.  
  353.